package com.code2roc.jarmanage.util;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Duration;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class CMDUtil {

    public static String executeWindowCommand(String stam){
        try{
            clearCommandLog();
            String folderPath = "command"+File.separator;
            String resultFilePath = folderPath + CommonUtil.getNewGuid() + ".cmd";
            File file = new File(folderPath);
            File tmpFile = new File(resultFilePath);//新建一个用来存储结果的缓存文件
            if (!file.exists()) {
                file.mkdirs();
            }
            if (!tmpFile.exists()) {
                tmpFile.createNewFile();
            }
            ProcessBuilder pb = new ProcessBuilder().command("cmd.exe", "/c", stam).inheritIO();
            pb.redirectErrorStream(true);//这里是把控制台中的红字变成了黑字，用通常的方法其实获取不到，控制台的结果是pb.start()方法内部输出的。
            pb.redirectOutput(tmpFile);//把执行结果输出。
            pb.start().waitFor();//等待语句执行完成，否则可能会读不到结果。
            String resultContent = FileUtil.readFileContentGBK(resultFilePath);
            //tmpFile.delete();
            return resultContent;
        }catch (Exception e){
            LogUtil.error(e);
        }
        return "";
    }

    public static String executeWindowCommand(String stam,String executePath){
        try{
            clearCommandLog();
            String folderPath = "command"+File.separator;
            String resultFilePath = folderPath + CommonUtil.getNewGuid() + ".cmd";
            File file = new File(folderPath);
            File tmpFile = new File(resultFilePath);//新建一个用来存储结果的缓存文件
            if (!file.exists()) {
                file.mkdirs();
            }
            if (!tmpFile.exists()) {
                tmpFile.createNewFile();
            }
            ProcessBuilder pb = new ProcessBuilder().command("cmd.exe", "/c", stam).inheritIO();
            pb.directory(new File(executePath));
            pb.redirectErrorStream(true);//这里是把控制台中的红字变成了黑字，用通常的方法其实获取不到，控制台的结果是pb.start()方法内部输出的。
            pb.redirectOutput(tmpFile);//把执行结果输出。
            pb.start().waitFor();//等待语句执行完成，否则可能会读不到结果。
            String resultContent = FileUtil.readFileContentGBK(resultFilePath);
            tmpFile.delete();
            return resultContent;
        }catch (Exception e){
            LogUtil.error(e);
        }
        return "";
    }

    public static String executeWindowCommandStoreFile(String stam){
        try{
            clearCommandLog();
            String folderPath = "command"+File.separator;
            String resultFilePath = folderPath + CommonUtil.getNewGuid() + ".cmd";
            File file = new File(folderPath);
            File tmpFile = new File(resultFilePath);//新建一个用来存储结果的缓存文件
            if (!file.exists()) {
                file.mkdirs();
            }
            if (!tmpFile.exists()) {
                tmpFile.createNewFile();
            }
            ProcessBuilder pb = new ProcessBuilder().command("cmd.exe", "/c", stam).inheritIO();
            pb.redirectErrorStream(true);//这里是把控制台中的红字变成了黑字，用通常的方法其实获取不到，控制台的结果是pb.start()方法内部输出的。
            pb.redirectOutput(tmpFile);//把执行结果输出。
            pb.start().waitFor();//等待语句执行完成，否则可能会读不到结果。
            return resultFilePath;
        }catch (Exception e){
            LogUtil.error(e);
        }
        return "";
    }

    public static String executeLinuxCommand(String stam){
        try{
            clearCommandLog();
            String folderPath = "command"+File.separator;
            String resultFilePath = folderPath + CommonUtil.getNewGuid() + ".cmd";
            File file = new File(folderPath);
            File tmpFile = new File(resultFilePath);//新建一个用来存储结果的缓存文件
            if (!file.exists()) {
                file.mkdirs();
            }
            if (!tmpFile.exists()) {
                tmpFile.createNewFile();
            }
            ProcessBuilder pb = new ProcessBuilder().command("/bin/sh", "-c", stam).inheritIO();
            pb.redirectErrorStream(true);//这里是把控制台中的红字变成了黑字，用通常的方法其实获取不到，控制台的结果是pb.start()方法内部输出的。
            pb.redirectOutput(tmpFile);//把执行结果输出。
            pb.start().waitFor();//等待语句执行完成，否则可能会读不到结果。
            String resultContent = FileUtil.readFileContent(resultFilePath);
            tmpFile.delete();
            return resultContent;
        }catch (Exception e){
            LogUtil.error(e);
        }
        return "";
    }

    public static String executeLinuxCommandWithStore(String stam){
        try{
            clearCommandLog();
            String folderPath = "command"+File.separator;
            String resultFilePath = folderPath + CommonUtil.getNewGuid() + ".cmd";
            File file = new File(folderPath);
            File tmpFile = new File(resultFilePath);//新建一个用来存储结果的缓存文件
            if (!file.exists()) {
                file.mkdirs();
            }
            if (!tmpFile.exists()) {
                tmpFile.createNewFile();
            }
            ProcessBuilder pb = new ProcessBuilder().command("/bin/sh", "-c", stam).inheritIO();
            pb.redirectErrorStream(true);//这里是把控制台中的红字变成了黑字，用通常的方法其实获取不到，控制台的结果是pb.start()方法内部输出的。
            pb.redirectOutput(tmpFile);//把执行结果输出。
            pb.start().waitFor();//等待语句执行完成，否则可能会读不到结果。
            return resultFilePath;
        }catch (Exception e){
            LogUtil.error(e);
        }
        return "";
    }

    public static void clearCommandLog(){
        try{
            String folderPath = "command"+File.separator;
            File file = new File(folderPath);
            if(file.exists()){
                List<File> fileList = Arrays.asList(file.listFiles());
                for (File item:fileList) {
                    BasicFileAttributes fileInfo = Files.readAttributes(Paths.get(item.getAbsolutePath()), BasicFileAttributes.class);
                    Duration duration = Duration.between(fileInfo.creationTime().toInstant(),new Date().toInstant());
                    if(duration.getSeconds()>60){
                        item.delete();
                    }
                }
            }
        }catch (Exception e){
            LogUtil.error(e);
        }
    }
}
